package com.bolt.support.spring.jpa.repository;

import com.bolt.convention.data.PageInfo;
import com.bolt.convention.data.Pagination;
import com.bolt.support.spring.jpa.filter.GroupPropertyFilter;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Optional;

/**
 * Created by Administrator on 2017/8/9.
 */
@NoRepositoryBean
public interface BasicJpaRepository<T, ID extends Serializable> extends JpaRepository <T, ID>, JpaSpecificationExecutor <T> {

    /**
     * 通过属性过滤器查询全部对象
     *
     * @param filters 属性过滤器集合
     * @return List
     */
    public List <T> findAll(GroupPropertyFilter filters);



    /**
     * 通过属性过滤器查询对象分页
     *
     * @param pageable 分页参数
     * @param filters  属性过滤器集合
     * @return {@link Page}
     */
    Page <T> findPage(Pageable pageable, GroupPropertyFilter filters);


    /**
     * 通过属性过滤器查询对象分页
     *
     * @param pageable
     * @param filters
     * @return
     */
    PageInfo <T> findPage(Pagination pageable, GroupPropertyFilter filters);

    /**
     *通过属性过滤器查询指定长度对象
     * @param spec 属性过滤器集合
     * @param sort 排序形式
     * @param limit  返回长度
     * @return
     */

    List<T> findLimit(Specification spec, Sort sort, int limit);

    /**
     * 通过属性过滤器查询单个对象
     *
     * @param filters 属性过滤器
     * @return Object
     */
    Optional <T> findOne(GroupPropertyFilter filters);


    // 扩展提供 SPRING　Jpa 基础函数，以供service层更灵活使用
    ID getIdentifier(T entity);


    boolean isManaged(T entity);

}
